/*
Copyright 2022.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package v1

import (
	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

// EDIT THIS FILE!  THIS IS SCAFFOLDING FOR YOU TO OWN!
// NOTE: json tags are required.  Any new fields you add must have json tags for the fields to be serialized.

// MsbDeploymentSpec defines the desired state of MsbDeployment
type MsbDeploymentSpec struct {
	// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
	// Important: Run "make" to regenerate code after modifying this file

	//Image 存储
	Image string `json:"image"`

	//Port 存储服务提供的端口
	//+optional
	Port int32 `json:"port,omitempty"`

	//+optional
	Replicas int32 `json:"replicas,omitempty"`

	//+optional
	StartCmd string `json:"startCmd,omitempty"`

	//+optional
	Args []string `json:"args,omitempty"`

	//+optional
	Environments []corev1.EnvVar `json:"environments,omitempty"`

	Expose *Expose `json:"expose"`
}

type Expose struct {
	Mode string `json:"mode"` //nodePort or Ingress
	//+optional
	IngressDomain string `json:"ingressDomain"`

	//+optional
	NodePort int32 `json:"nodePort"`
	//+optional
	ServicePort int32 `json:"servicePort"`
}

// MsbDeploymentStatus defines the observed state of MsbDeployment
type MsbDeploymentStatus struct {
	// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
	// Important: Run "make" to regenerate code after modifying this file

	//+optional
	Phase   string `json:"phase"`
	Message string `json:"message"`
	//+optional
	Reason string `json:"reason"`
	//子资源的状态
	//+optional
	Conditions []Condition `json:"conditions"`
}

type Condition struct {
	//+optional
	Type string `json:"type,omitempty"`
	//+optional
	Message string `json:"message,omitempty"`
	//+optional
	Status string `json:"status,omitempty"`
	//+optional
	Reason string `json:"reason,omitempty"`
	//最后创建，更新的时间
	//+optional
	LastTrasitionTime metav1.Time `json:"lastTrasitionTime,omitempty"`
}

//+kubebuilder:object:root=true
//+kubebuilder:subresource:status

// MsbDeployment is the Schema for the msbdeployments API
type MsbDeployment struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   MsbDeploymentSpec   `json:"spec,omitempty"`
	Status MsbDeploymentStatus `json:"status,omitempty"`
}

//+kubebuilder:object:root=true

// MsbDeploymentList contains a list of MsbDeployment
type MsbDeploymentList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []MsbDeployment `json:"items"`
}

func init() {
	SchemeBuilder.Register(&MsbDeployment{}, &MsbDeploymentList{})
}
